package cn.jingyuan.owl.utils.core.map;

import cn.jingyuan.owl.utils.core.StringUtils;

import java.util.HashMap;
import java.util.Map;

/**
 * 驼峰 Key 风格的 Map<br>
 * 对 KEY 转换为驼峰，get("int_value")和 get("intValue")获得的值相同，put 进入的值也会被覆盖
 *
 * @param <K> 键类型
 * @param <V> 值类型
 */
public class CamelCaseMap<K, V> extends CustomKeyMap<K, V> {

    /**
     * 构造
     */
    public CamelCaseMap() {
        this(DEFAULT_INITIAL_CAPACITY);
    }

    /**
     * 构造
     *
     * @param initialCapacity 初始大小
     */
    public CamelCaseMap(int initialCapacity) {
        this(initialCapacity, DEFAULT_LOAD_FACTOR);
    }

    /**
     * 构造
     *
     * @param m Map
     */
    public CamelCaseMap(Map<? extends K, ? extends V> m) {
        this(DEFAULT_LOAD_FACTOR, m);
    }

    /**
     * 构造
     *
     * @param loadFactor 加载因子
     * @param m Map
     */
    public CamelCaseMap(float loadFactor, Map<? extends K, ? extends V> m) {
        this(m.size(), loadFactor);
        this.putAll(m);
    }

    /**
     * 构造
     *
     * @param initialCapacity 初始大小
     * @param loadFactor 加载因子
     */
    public CamelCaseMap(int initialCapacity, float loadFactor) {
        super(new HashMap<>(initialCapacity, loadFactor));
    }

    /**
     * 将 Key 转为驼峰风格，如果 key 为字符串的话
     *
     * @param key KEY
     *
     * @return 驼峰 Key
     */
    @Override
    protected Object customKey(Object key) {
        if (key instanceof CharSequence) {
            key = StringUtils.toCamelCase(key.toString());
        }
        return key;
    }

}
